package gybase04

/**
 ********************************************************
 * Author: chinadragon
 * Time: 2021/12/26 下午5:38
 * Name: MOP 元对象协议 Meta object protocol
 *          元编程
 * Overview:
 * Usage:
 ********************************************************
 *
 * 1、实现方法拦截 : 实现 GroovyInterceptable
 */
class PersonMop implements GroovyInterceptable {
    def func(){
//        println" i hava a dream"
        System.out.println(" i hava a dream")
    }
    @Override
    Object invokeMethod(String name, Object args) {
        //        println" invokeMethod 方法 " // 这里是使用 println 打印会导致无限递归，println方法是 PersonMop 里面的，请看 println 源码

        System.out.println(" name = $name invokeMethod 方法 ")
//        respondsTo(name) // 判断方法是否存在 , 这里直接调用respondsTo会导致无限递归
        if (metaClass.invokeMethod(this,'respondsTo',name,args)){
            System.out.println("$name  方法 存在")
            System.out.println("$name  方法 执行前")

            metaClass.invokeMethod(this,name,args)
            System.out.println("$name  方法 执行后")

        }
    }
}

new PersonMop().func()
// name = func invokeMethod 方法
//func  方法 存在
//func  方法 执行前
// i hava a dream
//func  方法 执行后
